package algo3.pruebas.barcosTest;


import java.util.ArrayList;

import junit.framework.TestCase;
import algo3.modelo.Direccion;
import algo3.modelo.Posicion;
import algo3.modelo.armas.Danio;
import algo3.modelo.armas.DisparoConvencional;
import algo3.modelo.barcos.Barco;

abstract class BarcoAbstractTestConHerencia extends TestCase {
	
	abstract Barco crearBarco( Posicion posicion, Direccion direccion, Direccion Orientacion);

    public void testCrearConPosicionEnElOrigen(){
        Posicion pos = new Posicion(0, 0);
        Barco barco = crearBarco(pos, Direccion.DERECHA, Direccion.DERECHA);
        assertEquals(barco.getPosicion(), pos);
    }


    public void testCrearConEstadoPerfecto(){ 		
    	Barco barco = crearBarco(new Posicion(0, 0), Direccion.DERECHA, Direccion.DERECHA); 		
    	assertEquals(Barco.Estado.PERFECTO, barco.getEstado()); 		
    }

    public void testInvertirDireccionDiagonal(){
    	Barco barco = crearBarco(new Posicion(0, 0), Direccion.DIAG_DERECHA_ARRIBA, Direccion.DERECHA);
    	barco.invertirDireccion();
    	assertEquals(Direccion.DIAG_IZQUIERDA_ABAJO, barco.getDireccion());
    	
    }
    
	public void testDisparosFallidos(){
    	Posicion pos = new Posicion(4, 3);
        Barco barco = crearBarco(pos, Direccion.DERECHA, Direccion.DERECHA);
        barco.recibirDanio(new Danio(new Posicion(4, 2), DisparoConvencional.class));
        barco.recibirDanio(new Danio(new Posicion(5, 2), DisparoConvencional.class));
        barco.recibirDanio(new Danio(new Posicion(3, 3), DisparoConvencional.class));
        assertEquals(Barco.Estado.PERFECTO, barco.getEstado());
	}
	
	 public void testAvanzarEnDireccionDiagonalDerechaArribaConOrientacionADerecha(){
	    	Posicion pos = new Posicion(4, 3);
	    	Barco barco = crearBarco(pos, Direccion.DIAG_DERECHA_ARRIBA, Direccion.DERECHA);
	    	barco.avanzar();
	    	ArrayList<Posicion> posiciones = barco.posicionesOcupadas();
	    	for(int i=1;i<posiciones.size();i++){
	    		assertEquals(barco.getPosicion(), new Posicion(5, 4));
	    		assertEquals(new Posicion(5+i, 4), posiciones.get(i));
	    	}
	    }
	 
	 public void testAvanzarEnDireccionAbajoConOrientacionADerecha(){
	    	Posicion pos = new Posicion(4, 3);
	    	Barco barco = crearBarco(pos, Direccion.ABAJO, Direccion.DERECHA);
	    	barco.avanzar();
	    	ArrayList<Posicion> posiciones = barco.posicionesOcupadas();
	    	for( int i=1;i<posiciones.size();i++){
	    	assertEquals(barco.getPosicion(), new Posicion(4, 2));
	        assertEquals(new Posicion(4+i, 2), posiciones.get(i));
	    	}
	    }
    
}